import pandas as pd

# 提取execl表格元素
def read_execle_2(file,string1,string2):
    df4 = pd.read_excel(file,engine='openpyxl')
    start_row = 0  # 例如，从第3行开始读取
    start_col = 0  # 例如，从第3列开始读取s
    search_value = 'Structure'
    # 遍历DataFrame寻找"膜层名称"
    for index, row in df4.iterrows():
        for col_index, cell_value in enumerate(row):
            # 检查单元格是否为字符串并且是否包含搜索值
            if isinstance(cell_value, str) and search_value == cell_value:
                start_row=col_index-1
                start_col=index+3
                # print(f"找到 '{search_value}' 在列索引 {index}，行索引 {col_index}")
                break  # 找到后可以退出内层循环



    # 指定起始行和列的索引（索引从0开始）
    # start_row = 2  # 例如，从第3行开始读取
    # start_col = 4  # 例如，从第3列开始读取

    # 读取Excel文件，跳过开始的行
    df1 = pd.read_excel(file, skiprows=start_row-1, keep_default_na=False)

    # 选择需要的列，假设我们选择从第二列到最后一列
    df2 = df1.iloc[:, start_col-1:]

    # 将选定区域的数据转换为行列表
    rows_list = df2.values.tolist()

    # 将每行数据转换为制表符分隔的字符串
    text_list = ['\t'.join(map(str, row)) for row in rows_list]


    # 打开文件准备写入
    with open('1100.txt', 'w', encoding='utf-8') as f:
        for line in text_list:
            # 去掉line元素前面的空格
            line=line.lstrip()
            f.write(line + '\n')

        
    # 使用pandas的read_csv函数读取txt文件内容，并转换为DataFrame
    df_from_txt = pd.read_csv('1100.txt', sep='\t', header=None)
    # 将DataFrame写入到一个新的Excel文件
    df_from_txt.to_excel('new_table.xlsx', index=False,header=False)



    # 读取Excel文件
    df = pd.read_excel('new_table.xlsx',engine='openpyxl')

    column_index = 0
    search_value = '膜层名称'
    # 遍历DataFrame寻找"膜层名称"
    for index, row in df.iterrows():
        for col_index, cell_value in enumerate(row):
            # 检查单元格是否为字符串并且是否包含搜索值
            if isinstance(cell_value, str) and search_value == cell_value:
                column_index=index
                # print(f"找到 '{search_value}' 在行索引 {index}，列索引 {col_index}")
                break  # 找到后可以退出内层循环
    # 初始化计数器

    #打印”膜层名称“所在行的元素值 并用字典存储值和列表
    data=df.iloc[column_index].values#0表示第一行，不包含表头
    datas = data[~pd.isna(data)]
    datas=datas.tolist()
    col_index_list=[]
    for data1 in datas:
        for index, row in df.iterrows():
            for col_index, cell_value in enumerate(row):
                # 检查单元格是否为字符串并且是否包含搜索值
                if isinstance(cell_value, str) and data1 == cell_value:
                    # print(f"找到 '{data1}' 在行索引 {index}，列索引 {col_index}")
                    col_index_list.append(col_index)
                    break  # 找到后可以退出内层循环
    dict_elem_row={}
    for symbol,digit in zip(datas,col_index_list):
            dict_elem_row[symbol] = digit 
    # print(dict_elem_row)


    #打印”膜层名称“所在列的元素值，并用字典存储值和行标
    count = 0
    elements=[]

    # 跳过标题行，从第一行数据开始统计
    df = df.iloc[1:]  # 假设第一行为标题行

    # 找出"膜层名称"列中非空的行数，直到遇到"Define"
    for index, row in df.iterrows():
        cell_value = row.iloc[column_index]
        # 检查单元格是否为字符串，如果是，则使用strip()方法
        if isinstance(cell_value, str) and cell_value.strip():
            # 检查单元格内容是否不等于'膜层名称'和'Define'
            if cell_value.strip() != '膜层名称' and cell_value.strip() != 'Define' and cell_value.strip() != '':
            # if row[column_index].strip() != 'mocengmingcheng' and row[column_index].strip() != 'Define':
                count += 1
                # print(cell_value)
                elements.append(cell_value)
            else:
                break  # 遇到'Define'，停止计数
    # for element in elements:
    #     print(element)
    # print(f"从'膜层名称'到'Define'之前的行数共有：{count}行")

    #定义一个字典存储element,index(行标)
    dict_elem_index={}

    for index, row in df.iterrows():
        for col_index, cell_value in enumerate(row):
            for element in elements: 
            # 检查单元格是否为字符串并且是否包含搜索值
                if isinstance(cell_value, str) and element in cell_value:
                    # column_index=index
                    # 想法在获取行标
                    dict_elem_index[element]=index
                    # print(f"找到 '{element}' 在行索引 {index}，列索引 {col_index}")
                    break  # 找到后可以退出内层循环

    # print(dict_elem_index)


    a=dict_elem_index[string1]
    b=dict_elem_row[string2]

    if pd.isna(df.iloc[a-1, b]):
        data3 = None  # 或者选择一个默认值
    else:
        data3 = df.iloc[a-1, b]

    return data3

    
    # # print(a,b)
    # data3=df.iloc[a-1,b]
    # # print(data3)
    # return data3



def read_execle(file,string1,string2,a):

    sheet_name = f'Sheet{a}'  # 如果需要，指定工作表名称

    # 读取Excel工作表
    df = pd.read_excel(file, sheet_name=sheet_name,engine='openpyxl')
    column_index = 0
    # search_value = '膜层名称'
    # 遍历DataFrame寻找"膜层名称"
    # for index, row in df.iterrows():
        # for col_index, cell_value in enumerate(row):
        #     # 检查单元格是否为字符串并且是否包含搜索值
        #     if isinstance(cell_value, str) and search_value == cell_value:
        #         column_index=index
        #         print(f"找到 '{search_value}' 在行索引 {index}，列索引 {col_index}")
        #         break  # 找到后可以退出内层循环
        #打印”膜层名称“所在行的元素值 并用字典存储值和列表
    data=df.iloc[column_index].values#0表示第一行，不包含表头
    datas = data[~pd.isna(data)]
    datas=datas.tolist()
    col_index_list=[]
    for data1 in datas:
        for index, row in df.iterrows():
            for col_index, cell_value in enumerate(row):
                # 检查单元格是否为字符串并且是否包含搜索值
                if isinstance(cell_value, str) and data1 == cell_value:
                    # print(f"找到 '{data1}' 在行索引 {index}，列索引 {col_index}")
                    col_index_list.append(col_index)
                    break  # 找到后可以退出内层循环
    dict_elem_row={}
    for symbol,digit in zip(datas,col_index_list):#col_index_list:列
            dict_elem_row[symbol] = digit 
    # print(dict_elem_row)
    # print()
    # print()

    # count = 0
    # elements=[]

    # 跳过标题行，从第一行数据开始统计
    df = df.iloc[1:]  # 假设第一行为标题行
    dict_elem_index={}

    for index, row in df.iterrows():
        cell_value = row.iloc[column_index]

        if isinstance(cell_value, str) and cell_value.strip():

            if cell_value.strip() != '膜层名称' and cell_value.strip() != '':

                dict_elem_index[cell_value]=index
            else:
                break  


    # print(dict_elem_index)

    # a=dict_elem_index[string1]
    # b=dict_elem_row[string2]

    if pd.isna(df.iloc[dict_elem_index[string1]-1, dict_elem_row[string2]]):
        data3 = None  # 或者选择一个默认值
    else:
        data3 = df.iloc[dict_elem_index[string1]-1, dict_elem_row[string2]]
    # print(data3)
    return data3

# execel_file ='C:\\Users\\admin\\Desktop\\主动光学仿真\\仿真设置.xlsx'

# result = read_execle(execel_file, 'SiON-i4', '折射率曲线',1)
# print(result)

#打印“膜层名称”这一列所包含名称：
# Air2
# PAS
# IL2
# IL1
# SiN
# SiON-i4
# IJP 
# SiON-i3
# .....
def Coating_Name(file,a):
    # 读取Excel文件
    sheet_name = f'Sheet{a}'  # 如果需要，指定工作表名称
    # 读取Excel工作表
    df = pd.read_excel(file, sheet_name=sheet_name,engine='openpyxl')

    column_index = 0
    search_value = '膜层名称'
    # 遍历DataFrame寻找"膜层名称"
    for index, row in df.iterrows():
        for col_index, cell_value in enumerate(row):
            # 检查单元格是否为字符串并且是否包含搜索值
            if isinstance(cell_value, str) and search_value == cell_value:
                column_index=index
                # print(f"找到 '{search_value}' 在行索引 {index}，列索引 {col_index}")
                break  # 找到后可以退出内层循环
    # 初始化计数器
    elements=[]

    # 跳过标题行，从第一行数据开始统计
    df = df.iloc[1:]  # 假设第一行为标题行

    # 找出"膜层名称"列中非空的行数，直到遇到""
    for index, row in df.iterrows():
        cell_value = row.iloc[column_index]
        # 检查单元格是否为字符串，如果是，则使用strip()方法
        if isinstance(cell_value, str) and cell_value.strip():
            # 检查单元格内容是否不等于'膜层名称'和''
            if cell_value.strip() != '膜层名称' and cell_value.strip() != '':
                # elements.append(cell_value.strip())
                elements.append(cell_value)
            else:
                break  # 遇到''，停止计数
    return elements



def Coating_Name_1(file):
    df4 = pd.read_excel(file,engine='openpyxl')
    start_row = 0  # 例如，从第3行开始读取
    start_col = 0  # 例如，从第3列开始读取s
    search_value = 'Structure'
    # 遍历DataFrame寻找"膜层名称"
    for index, row in df4.iterrows():
        for col_index, cell_value in enumerate(row):
            # 检查单元格是否为字符串并且是否包含搜索值
            if isinstance(cell_value, str) and search_value == cell_value:
                start_row=col_index-1
                start_col=index+3
                # print(f"找到 '{search_value}' 在列索引 {index}，行索引 {col_index}")
                break  # 找到后可以退出内层循环

    df1 = pd.read_excel(file, skiprows=start_row-1, keep_default_na=False)

    # 选择需要的列，假设我们选择从第二列到最后一列
    df2 = df1.iloc[:, start_col-1:]

    # 将选定区域的数据转换为行列表
    rows_list = df2.values.tolist()

    # 将每行数据转换为制表符分隔的字符串
    text_list = ['\t'.join(map(str, row)) for row in rows_list]


    # 打开文件准备写入
    with open('1100.txt', 'w', encoding='utf-8') as f:
        for line in text_list:
            # 去掉line元素前面的空格
            line=line.lstrip()
            f.write(line + '\n')

        
    # 使用pandas的read_csv函数读取txt文件内容，并转换为DataFrame
    df_from_txt = pd.read_csv('1100.txt', sep='\t', header=None)
    # 将DataFrame写入到一个新的Excel文件
    df_from_txt.to_excel('new_table.xlsx', index=False,header=False)



    # 读取Excel文件
    df = pd.read_excel('new_table.xlsx',engine='openpyxl')

    column_index = 0
    search_value = '膜层名称'
    # 遍历DataFrame寻找"膜层名称"
    for index, row in df.iterrows():
        for col_index, cell_value in enumerate(row):
            # 检查单元格是否为字符串并且是否包含搜索值
            if isinstance(cell_value, str) and search_value == cell_value:
                column_index=index
                # print(f"找到 '{search_value}' 在行索引 {index}，列索引 {col_index}")
                break  # 找到后可以退出内层循环
    # 初始化计数器
    count = 0
    elements=[]

    # 跳过标题行，从第一行数据开始统计
    df = df.iloc[1:]  # 假设第一行为标题行

    # 找出"膜层名称"列中非空的行数，直到遇到"Define"
    for index, row in df.iterrows():
        cell_value = row.iloc[column_index]
        # 检查单元格是否为字符串，如果是，则使用strip()方法
        if isinstance(cell_value, str) and cell_value.strip():
            # 检查单元格内容是否不等于'膜层名称'和'Define'
            if cell_value.strip() != '膜层名称' and cell_value.strip() != 'Define' and cell_value.strip() != '':
            # if row[column_index].strip() != 'mocengmingcheng' and row[column_index].strip() != 'Define':
                count += 1
                # print(cell_value)
                elements.append(cell_value)
            else:
                break  # 遇到'Define'，停止计数
    return elements





def Coating_Name_row_element(file,a):
    sheet_name = f'Sheet{a}'  # 如果需要，指定工作表名称
    # 读取Excel工作表
    df = pd.read_excel(file, sheet_name=sheet_name,engine='openpyxl')

    column_index = 0
    search_value = '膜层名称'
    # 遍历DataFrame寻找"膜层名称"
    for index, row in df.iterrows():
        for col_index, cell_value in enumerate(row):
            # 检查单元格是否为字符串并且是否包含搜索值
            if isinstance(cell_value, str) and search_value == cell_value:
                column_index=index
                # print(f"找到 '{search_value}' 在行索引 {index}，列索引 {col_index}")
                break  # 找到后可以退出内层循环
    # 初始化计数器

    #打印”膜层名称“所在行的元素值 并用字典存储值和列表
    data=df.iloc[column_index].values#0表示第一行，不包含表头
    datas = data[~pd.isna(data)]
    datas=datas.tolist()
    return datas
#打印“膜层名称”这一行，所在的行元素：膜层名称	是否勾选	厚度	单位	折射率曲线	膜层特性
def Coating_Name_row_element_1(file):
    df4 = pd.read_excel(file,engine='openpyxl')
    start_row = 0  # 例如，从第3行开始读取
    start_col = 0  # 例如，从第3列开始读取s
    search_value = 'Structure'
    # 遍历DataFrame寻找"膜层名称"
    for index, row in df4.iterrows():
        for col_index, cell_value in enumerate(row):
            # 检查单元格是否为字符串并且是否包含搜索值
            if isinstance(cell_value, str) and search_value == cell_value:
                start_row=col_index-1
                start_col=index+3
                # print(f"找到 '{search_value}' 在列索引 {index}，行索引 {col_index}")
                break  # 找到后可以退出内层循环



    # 指定起始行和列的索引（索引从0开始）
    # start_row = 2  # 例如，从第3行开始读取
    # start_col = 4  # 例如，从第3列开始读取

    # 读取Excel文件，跳过开始的行
    df1 = pd.read_excel(file, skiprows=start_row-1, keep_default_na=False)

    # 选择需要的列，假设我们选择从第二列到最后一列
    df2 = df1.iloc[:, start_col-1:]

    # 将选定区域的数据转换为行列表
    rows_list = df2.values.tolist()

    # 将每行数据转换为制表符分隔的字符串
    text_list = ['\t'.join(map(str, row)) for row in rows_list]


    # 打开文件准备写入
    with open('1100.txt', 'w', encoding='utf-8') as f:
        for line in text_list:
            # 去掉line元素前面的空格
            line=line.lstrip()
            f.write(line + '\n')

        
    # 使用pandas的read_csv函数读取txt文件内容，并转换为DataFrame
    df_from_txt = pd.read_csv('1100.txt', sep='\t', header=None)
    # 将DataFrame写入到一个新的Excel文件
    df_from_txt.to_excel('new_table.xlsx', index=False,header=False)



    # 读取Excel文件
    df = pd.read_excel('new_table.xlsx',engine='openpyxl')

    column_index = 0
    search_value = '膜层名称'
    # 遍历DataFrame寻找"膜层名称"
    for index, row in df.iterrows():
        for col_index, cell_value in enumerate(row):
            # 检查单元格是否为字符串并且是否包含搜索值
            if isinstance(cell_value, str) and search_value == cell_value:
                column_index=index
                # print(f"找到 '{search_value}' 在行索引 {index}，列索引 {col_index}")
                break  # 找到后可以退出内层循环
    # 初始化计数器

    #打印”膜层名称“所在行的元素值 并用字典存储值和列表
    data=df.iloc[column_index].values#0表示第一行，不包含表头
    datas = data[~pd.isna(data)]
    datas=datas.tolist()
    return datas
    


















